package com.bestcem.xm.user.dao;

import com.bestcem.xm.user.entity.pojo.UserUserGroupDO;
import com.bestcem.xm.user.entity.pojo.UserWithGroupDO;
import com.bestcem.xm.user.grpc.service.param.GroupIdsPageParam;

import java.util.List;
import java.util.Map;

/**
 * 用户与用户组的关联信息dao
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2021/12/29 10:34
 */
public interface UserUserGroupDao {


    /**
     * 为当前组织添加账号
     *
     * @param userUserGroupDO 用户关联组织数据
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:20
     */
    String saveUserToGroup(UserUserGroupDO userUserGroupDO);

    /**
     * 批量插入用户关联组织
     *
     * @param dos 用户关联组织数据
     * @return java.lang.Integer
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 19:39
     */
    Integer insertUserGroupList(List<UserUserGroupDO> dos);

    /**
     * 根据相关字段删除用户组织关联关系
     *
     * @param userUserGroupDO 参数信息
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/04/29 17:05
     */
    Integer deleteBySelective(UserUserGroupDO userUserGroupDO);

    /**
     * 查询当前组织下的所有账号
     *
     * @param groupId 组织id
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:50
     */
    List<String> getUserIdsByGroupId(String groupId);

    /**
     * 查询当前组织列表下的所有账号
     *
     * @param param 分页、用户组id、是否包含子组、排序字段
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/25 16:49
     */
    List<String> getUserIdsByGroupIds(GroupIdsPageParam param);

    /**
     * 查询当前组织列表下的所有账号数量
     *
     * @param groupIds 用户组id列表
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 16:32
     */
    Integer getUserCountByGroupIds(List<String> groupIds);

    /**
     * 获取当前组已经存在的指定用户id列表
     *
     * @param groupId 用户组id
     * @param userIds 用户id列表
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 16:46
     */
    List<String> listUserIds(String groupId, List<String> userIds);

    /**
     * 删除某个用户组下指定的用户列表信息
     *
     * @param groupId 用户组id
     * @param userIds 用户id列表
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 16:26
     */
    Integer deleteByGroupIdAndUserIds(String groupId, List<String> userIds);

    /**
     * 通过根组id获取用户
     *
     * @param condition 用户与组织的关联关系
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/1/4 13:50
     */
    List<UserUserGroupDO> listByCondition(UserUserGroupDO condition);

    /**
     * 根据相关字段查询用户与组织的关联关系
     *
     * @param userId       用户id
     * @param groupIdsList 组织id列表
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserUserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 13:38
     */
    List<UserUserGroupDO> listByUserIdAndGroupIds(String userId, List<String> groupIdsList);

    /**
     * 更新所有数据的时间
     *
     * @param userId          用户id
     * @param alreadyGroupIds 组织id列表
     * @return int
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 14:21
     */
    int updateOperateTime(String userId, List<String> alreadyGroupIds);


    /**
     * 根据rootGroupID、UserID、groupID获取用户组关联信息列表
     *
     * @param userUserGroupDO 前端传入的usergroup
     * @param page            页数
     * @param size            分页大小
     * @return List<UserUserGroupDTO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/25 14:00
     */
    List<UserUserGroupDO> getUserUserGroupByEachId(UserUserGroupDO userUserGroupDO, Integer page, Integer size);

    /**
     * 根据userId查询关联的groupId列表
     *
     * @param userId 用户id
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/11 0:00
     */
    List<String> getGroupIdsByUserId(String userId);

    /**
     * 查询对应的用户数量
     *
     * @param groupIds 组织id列表
     * @return Map<String, Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 14:13
     */
    Map<String, Integer> countUserNumByGroupIds(List<String> groupIds);

    /**
     * 查询用户所关联的组织信息
     *
     * @param userId 用户id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserWithGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/25 19:14
     */
    List<UserWithGroupDO> getUserWithGroup(String userId);

    /**
     * 根据查询条件查询满足的数据的条数
     *
     * @param userUserGroupDO 查询条件
     * @return java.lang.Long 满足数据的条数
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 15:36
     */
    Long count(UserUserGroupDO userUserGroupDO);

}
